【まずは触って体験】リリース直後のAmazon EKSでサンプルアプリケーションを動かしてみた
コンテナオーケストレーションのデファクトスタンダード、Production-Grade Container Orchestration - KubernetesのAWSマネージド実装である、Amazon EKSがついに、GA(一般リリース)の運びとなりました!
Amazon Elastic Container Service for Kubernetes (EKS) が一般公開 (GA) されました!
早速、WEBコンソールとともにGetting Startedドキュメントが公開されていたので、まずは触ってみた様子をお届けいたします。
自分、dockerやECSは最近触ってますが、Kubernetesは一切触ったことありません(ドヤ)。なんですが、チュートリアルにそって作業していけば、ほぼつまるところなしに、Kubernetesのクラスターやワーカーノードの作成、サンプルアプリケーションのデプロイができました。
Kubernetes未経験の方でも、このチュートリアルでEKSのコンポーネントとやクラスターの設定方法などが一通り体験できるので、ぜひ一度手を動かしてみることをオススメします。
__ (祭) ∧ ∧ Y ( ゚Д゚) Φ[_ソ__y_l〉 EKSダワッショイ |_|_| し'´J
Amazon EKSとは?
What Is Amazon EKS? - Amazon EKS
Amazon Elastic Container Service for Kubernetes(以下、Amazon EKS)は、Kubernetesのマネージド実装で、AWS上でKubernetes control planeの管理を必要としません。Kubernetesには、自動デプロイ、スケーリング、コンテナ管理のアプリケーションも含まれています。
Amazon EKSはAZをまたいだ高可用性システムの提供、unhealthyなcontrol planeの自動置換、自動アップグレード機能などを持ちます。
Amazon EKSは最新版のオープンソースKubernetes上で動作し、Kubernetesコミュニティの全てのツールを利用することができます。Amazon EKSで可動するアプリケーションは、他のKubernetes環境でも完全に動作可能で、例えばオンプレミスデータセンターでも、他のパブリッククラウド上でもOK。これは、他のKubernetes環境からAmazon EKSへアプリケーション改修なしで移行可能ということです!
チュートリアルの手順
こちらのドキュメントを元に進めていきます。
Getting Started with Amazon EKS - Amazon EKS
手順の大まかな流れは以下の通り
- マネジメントコンソールでのEKSクラスターの作成
- CloudFormationによるworker nodeの起動
- Kubernetesツールの導入(例:kubectl)
- クラスターへのアプリケーションの導入
ほな、気軽にいってみましょ。
チュートリアルの前提条件
EKSやその他コンポーネントにアクセスするのに必要なIAMを用意しておきましょう。今回の検証ではAdministratorAccess権限をもつユーザーを利用しています。また、2018年6月6日現在、Amazon EKSは、以下のリージョンのみ対応しているので、リージョンはこれらを利用ください。
- US West (Oregon) (us-west-2)
- US East (N. Virginia) (us-east-1)
クラスター環境用VPCの作成
最初にクラスター環境用VPCを作成していきます。
CloudFormationの画面に移動し、EKS対応リージョン(今回はバージニア北部)を選択します。
スタック作成から、S3テンプレートのURLを指定し、以下のURLを入力します。
https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/amazon-eks-vpc-sample.yaml
スタック名にeks-vpcを設定。その他は特にこだわりなければ、デフォルトで。
オプションは特に指定せずに、スタック作成し、完了したら「出力」タブを確認。下記3つの値はあとで必要となるので、メモっておきます。
- SecurityGroups
- VpcId
- SubnetIds
Amazon EKS用kubectlのインストールと設定
Amazon EKS クラスターには、kubectlとkubeletバイナリと、IAM認証のためのHeptio Authenticatorが必要となります。
Amazon EKSのためのkubectlのインストール
クライアントOSにkubectlをインストールします。Amazon EKS-vendedのkubectlバイナリは、S3からダウンロードします。自分はMacなので、MacOS用のバイナリをダウンロード。本手順はMac用の物となっておりますので、別OSをご利用の方は、元のドキュメントを参照ください。
$curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/bin/darwin/amd64/kubectl
実行権限を付与します。
$chmod +x ./kubectl
kubectlのバイナリを$PATHが通るディレクトリに格納します(このパスが推奨らしいです)。
$cp ./kubectl $HOME/bin/kubectl && export PATH=$HOME/bin:$PATH
必要に応じて、シェル起動時にパスを通します。
$echo 'export PATH=$HOME/bin:$PATH' >> ~/.bash_profile
ターミナルに再ログインして、PATHとバージョンの確認をしておきましょう。
$kubectl version --short --client Client Version: v1.10.3
Amazon EKS用heptio-autenticator-awsのインストール
Mac用バイナリのダウンロード。
$curl -o heptio-authenticator-aws https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/bin/darwin/amd64/heptio-authenticator-aws
実行権限付与。
$chmod +x ./heptio-authenticator-aws
PATHの通ったディレクトリへの格納。
$cp ./heptio-authenticator-aws $HOME/bin/heptio-authenticator-aws && export PATH=$HOME/bin:$PATH
こちらもターミナルに再ログインしてPATHの確認とヘルプを表示しておきましょう。
$ heptio-authenticator-aws help A tool to authenticate to Kubernetes using AWS IAM credentials Usage: heptio-authenticator-aws [command] Available Commands: help Help about any command init Pre-generate certificate, private key, and kubeconfig files for the server. server Run a webhook validation server suitable that validates tokens using AWS IAM token Authenticate using AWS IAM and get token for Kubernetes verify Verify a token for debugging purpose Flags: -i, --cluster-id ID Specify the cluster ID, a unique-per-cluster identifier for your heptio-authenticator-aws installation. -c, --config filename Load configuration from filename -h, --help help for heptio-authenticator-aws Use "heptio-authenticator-aws [command] --help" for more information about a command.
EKSクラスターの作成
ここまでで、クライアント側の設定が完了したら、いよいよEKSクラスターを作成していきます。まずは、EKSコンソールにアクセス
https://console.aws.amazon.com/eks/home#/clusters
クラスターを作成します。
以下設定していきます。
- Cluster name:sample-eks-cluster
- Kubernets version:デフォルトで入力したもの
- Role ARN:Create your Amazon EKS Service Roleを参考に作成したRoleを設定
- VPC:先述したCloudFormationで作成したVPCを設定
- Subnet:上でVPCを選択すると、自動的に入力
- Security Groups:CloudFormationでスタック作成後に出力されたSecurity Groupを設定
作成ボタンを押すと、クラスターの作成が開始されます。
しばらく待つと(10分ほど)、ステータスがActiveになり、クラスターの詳細情報を確認できます。
kubectlの設定
クラスターのためのkubeconfigファイルを設定していきます。最初にkubectl格納に必要なディレクトリを作成します。
$mkdir -p ~/.kube
下記テンプレートを参考に、先程AWSコンソールで作成した情報を埋めていきます。
- endpoint-url
- base64-encoded-ca-cert
- cluster-name
- role-arn
apiVersion: v1 clusters: - cluster: server: <endpoint-url> certificate-authority-data: <base64-encoded-ca-cert> name: kubernetes contexts: - context: cluster: kubernetes user: aws name: aws current-context: aws kind: Config preferences: {} users: - name: aws user: exec: apiVersion: client.authentication.k8s.io/v1alpha1 command: heptio-authenticator-aws args: - "token" - "-i" - "<cluster-name>" # - "-r" # - "<role-arn>"
ファイル名はconfig-<cluster-name>として、上で作成した~/.kubeフォルダに格納します。
作成したファイルへのパスをKUBECONFIG環境変数に登録します。
$export KUBECONFIG=$KUBECONFIG:~/.kube/config-<cluster-name>
起動時に環境変数を読み込むように設定します。
echo 'export KUBECONFIG=$KUBECONFIG:~/.kube/config-<cluster-name>' >> ~/.bash_profile
設定ファイルのテストをして、無事クラスター情報が返ってきましたでしょうか?
$ kubectl get all NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 21m
EKSワーカーノードの起動
ここまででEKSクラスターの設定が完了しました。ここではEKSのワーカーノードを作成します。ワーカーノード起動のためのCloudFormationを利用します。
Webコンソールからスタックの作成で、下記S3URLを指定。
https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/amazon-eks-nodegroup.yaml
パラメータを設定していきます。
- Stack name:<cluster-name>-worker-nodes
- ClusterName:作成したクラスターの名前
- ClusterControlPlaneSecurityGroup:CloudFormationで作成したセキュリティグループ
- NodeGroupName:<cluster-name>-worker-nodes
- NodeAutoScalingGroupMinSize:スケーリンググループの最小数。デフォルトの1を設定
- NodeAutoScalingGroupMaxSize:スケーリンググループの最大数。デフォルトの3を設定
- NodeInstanceType:デフォルトのt2.medium
- NodeImageId:EKSワーカーノードで利用するAMIIDの指定
- US West (Oregon) (us-west-2):ami-73a6e20b
- US East (N. Virginia) (us-east-1):ami-dea4d5a1
- KeyName:EC2アクセス用のキーペア。SSHアクセスが必要であれば、別途作成しておき、ここで入力
- VpcId:CloudFormationで作成したVPCのID
- Subnets: CloudFormationで作成したSubnet
任意のオプションを指定し、スタックの作成を実行します。これもそれなりの時間かかります。えんやこらー。
イベントが全て完了したら、出力タブのNodeInstanceRoleのarnをメモって置きましょう!
クラスターのワーカーノードへの有効化
AWS認証用設定ファイルをダウンロードして、修正します。
curl -O https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/aws-auth-cm.yaml
ファイルを開いて、中のARN部分を、先程CloudFormationで設定したワーカーノードのARNを設定します。
apiVersion: v1 kind: ConfigMap metadata: name: aws-auth namespace: kube-system data: mapRoles: | - rolearn: <ARN of instance role (not instance profile)> username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes
設定ファイルをクラスターに適用します。
$ kubectl apply -f aws-auth-cm.yaml configmap "aws-auth" created
クラスターの状態を確認します。きちんと状態が取得できていますでしょうか?
$ kubectl get nodes --watch NAME STATUS ROLES AGE VERSION ip-192-168-137-228.ec2.internal Ready <none> 1m v1.10.3 ip-192-168-199-36.ec2.internal Ready <none> 1m v1.10.3 ip-192-168-77-28.ec2.internal Ready <none> 1m v1.10.3 ip-192-168-137-228.ec2.internal Ready <none> 1m v1.10.3 ip-192-168-199-36.ec2.internal Ready <none> 1m v1.10.3 ip-192-168-77-28.ec2.internal Ready <none> 1m v1.10.3
ここまで来たら、あともうひと踏ん張りやで。
サンプルアプリケーションの起動
サンプルアプリケーションをクラスターに導入し、起動します。全部で6回流すので、順次実行していきます。
$kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-master-controller.json replicationcontroller "redis-master" created $kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-master-service.json service "redis-master" created $kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-slave-controller.json replicationcontroller "redis-slave" created $kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/redis-slave-service.json service "redis-slave" created $kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/guestbook-controller.json replicationcontroller "guestbook" created $kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/v1.10.3/examples/guestbook-go/guestbook-service.json service "guestbook" created
サンプルアプリケーションの登録が完了したら、最後に、外部公開されたIPアドレスを確認します。
$ kubectl get services -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR guestbook LoadBalancer 10.100.115.63 ad804527f692b1XXXXXXXXXXXXXXXX-1487281215.us-east-1.elb.amazonaws.com 3000:31601/TCP 3m app=guestbook kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 1h <none> redis-master ClusterIP 10.100.223.16 <none> 6379/TCP 4m app=redis,role=master redis-slave ClusterIP 10.100.247.112 <none> 6379/TCP 45s app=redis,role=slave
LoadBalancerに割り当てられたEXTERNAL-IPエンドポイントに対して、ポート3000でアクセスします。無事、Guestbookサンプルアプリケーションが表示されたらOkです!
お疲れさまでしたー。なんとか順調にいけましたでしょうか?
最後に、アプリケーションのお掃除方法はこちら。
$kubectl delete rc/redis-master rc/redis-slave rc/guestbook svc/redis-master svc/redis-slave svc/guestbook
まとめ「まずは触って構成を体感してみましょ」
ここまで、ガガーっとチュートリアルやってみて、おぼろげながらEKSの構成とKubernetesの基本的なところがわかってきた気がします。kubectlをクライアントに導入してコントロールするというのも、ECSとはだいぶやり方が異なっていて新鮮でした。
何か最初に学習しようとしたときに、抽象的な概念を最初に読み込むよりも、まずは手を動かしてみることで、全体構成を具体的にイメージできるメリットがあります。今回のチュートリアルの中でも、クラスターやワーカーノードの作成を通じて、実際のアプリケーションのデプロイ方法などが体験できました。
これからは、Kubernetesそのものの理解を深めながら、既存ECSからの移行方法や、CI/CD周辺の自動化あたりを追求しつつ、わっせわっせとブログに書いていきますので、ご期待くださいませ。東京リージョンも熱望しておりますよ!
それでは、今日はこのへんで。濱田(@hamako9999)でした。
参考資料
弊社千葉が執筆していたこちらのシリーズでは、Amazon EKS以前のKubernetesそのものの理解を深めることができます。合わせてやってみることをオススメ致します。